{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:27:23.438404Z",
     "start_time": "2018-12-25T19:27:23.433144Z"
    }
   },
   "outputs": [],
   "source": [
    "from pathlib import Path\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import random\n",
    "import string"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:27:25.704591Z",
     "start_time": "2018-12-25T19:27:25.700064Z"
    }
   },
   "outputs": [],
   "source": [
    "results = {}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Generate Test Data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The test `DataFrame` that can be configured to contain numerical or text data, or both. For the HDF5 library, we test both the fixed and table format. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:27:29.681064Z",
     "start_time": "2018-12-25T19:27:29.673414Z"
    }
   },
   "outputs": [],
   "source": [
    "def generate_test_data(nrows=100000, numerical_cols=2000, text_cols=0, text_length=10):\n",
    "    ncols = numerical_cols + text_cols\n",
    "    s = \"\".join([random.choice(string.ascii_letters)\n",
    "                 for _ in range(text_length)])\n",
    "    data = pd.concat([pd.DataFrame(np.random.random(size=(nrows, numerical_cols))),\n",
    "                      pd.DataFrame(np.full(shape=(nrows, text_cols), fill_value=s))],\n",
    "                     axis=1, ignore_index=True)\n",
    "    data.columns = [str(i) for i in data.columns]\n",
    "    return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:27:33.463405Z",
     "start_time": "2018-12-25T19:27:29.683069Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 100000 entries, 0 to 99999\n",
      "Columns: 2000 entries, 0 to 1999\n",
      "dtypes: float64(2000)\n",
      "memory usage: 1.5 GB\n"
     ]
    }
   ],
   "source": [
    "df = generate_test_data()\n",
    "df.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Parquet"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:29:45.746202Z",
     "start_time": "2018-12-25T19:29:45.744438Z"
    }
   },
   "outputs": [],
   "source": [
    "parquet_file = Path('test.parquet')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:29:57.424957Z",
     "start_time": "2018-12-25T19:29:45.747437Z"
    }
   },
   "outputs": [],
   "source": [
    "df.to_parquet(parquet_file)\n",
    "size = parquet_file.stat().st_size"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Read"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:30:04.220835Z",
     "start_time": "2018-12-25T19:29:57.426230Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "809 ms ± 14.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<TimeitResult : 809 ms ± 14.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%timeit -o\n",
    "df = pd.read_parquet(parquet_file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:30:04.224309Z",
     "start_time": "2018-12-25T19:30:04.222682Z"
    },
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "read = _"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:30:04.416575Z",
     "start_time": "2018-12-25T19:30:04.225493Z"
    }
   },
   "outputs": [],
   "source": [
    "parquet_file.unlink()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Write"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:31:40.446836Z",
     "start_time": "2018-12-25T19:30:04.417448Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "12.1 s ± 32 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<TimeitResult : 12.1 s ± 32 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%timeit -o\n",
    "df.to_parquet(parquet_file)\n",
    "parquet_file.unlink()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:31:40.449564Z",
     "start_time": "2018-12-25T19:31:40.448011Z"
    }
   },
   "outputs": [],
   "source": [
    "write = _"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:31:40.557150Z",
     "start_time": "2018-12-25T19:31:40.451140Z"
    }
   },
   "outputs": [],
   "source": [
    "results['parquet'] = {'read': read.all_runs, 'write': write.all_runs, 'size': size}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## HDF5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:31:40.621986Z",
     "start_time": "2018-12-25T19:31:40.559494Z"
    }
   },
   "outputs": [],
   "source": [
    "test_store = Path('index.h5')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Fixed Format"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:31:44.809005Z",
     "start_time": "2018-12-25T19:31:40.635426Z"
    }
   },
   "outputs": [],
   "source": [
    "with pd.HDFStore(test_store) as store:\n",
    "    store.put('file', df)\n",
    "size = test_store.stat().st_size"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Read"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:31:48.408215Z",
     "start_time": "2018-12-25T19:31:44.809934Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "449 ms ± 9.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<TimeitResult : 449 ms ± 9.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%timeit -o\n",
    "with pd.HDFStore(test_store) as store:\n",
    "    store.get('file')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:31:48.410709Z",
     "start_time": "2018-12-25T19:31:48.409085Z"
    }
   },
   "outputs": [],
   "source": [
    "read = _"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:31:48.556737Z",
     "start_time": "2018-12-25T19:31:48.411668Z"
    }
   },
   "outputs": [],
   "source": [
    "test_store.unlink()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Write"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:22.178194Z",
     "start_time": "2018-12-25T19:31:48.557651Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4.2 s ± 28.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<TimeitResult : 4.2 s ± 28.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%timeit -o\n",
    "with pd.HDFStore(test_store) as store:\n",
    "    store.put('file', df)\n",
    "test_store.unlink()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:22.180804Z",
     "start_time": "2018-12-25T19:32:22.179212Z"
    }
   },
   "outputs": [],
   "source": [
    "write = _"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:22.195127Z",
     "start_time": "2018-12-25T19:32:22.181934Z"
    }
   },
   "outputs": [],
   "source": [
    "results['hdf_fixed'] = {'read': read.all_runs, 'write': write.all_runs, 'size': size}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Table Format"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:25.050163Z",
     "start_time": "2018-12-25T19:32:22.196674Z"
    }
   },
   "outputs": [],
   "source": [
    "with pd.HDFStore(test_store) as store:\n",
    "    store.append('file', df, format='t')\n",
    "size = test_store.stat().st_size    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Read"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:29.430444Z",
     "start_time": "2018-12-25T19:32:25.051183Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "508 ms ± 9.14 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<TimeitResult : 508 ms ± 9.14 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%timeit -o\n",
    "with pd.HDFStore(test_store) as store:\n",
    "    df = store.get('file')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:29.433656Z",
     "start_time": "2018-12-25T19:32:29.431766Z"
    }
   },
   "outputs": [],
   "source": [
    "read = _"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:29.579892Z",
     "start_time": "2018-12-25T19:32:29.435654Z"
    }
   },
   "outputs": [],
   "source": [
    "test_store.unlink()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Write"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that `write` in table format does not work with text data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:52.918475Z",
     "start_time": "2018-12-25T19:32:29.580905Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.92 s ± 11.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<TimeitResult : 2.92 s ± 11.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%timeit -o\n",
    "with pd.HDFStore(test_store) as store:\n",
    "    store.append('file', df, format='t')\n",
    "test_store.unlink()    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:52.921247Z",
     "start_time": "2018-12-25T19:32:52.919473Z"
    }
   },
   "outputs": [],
   "source": [
    "write = _"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:52.931028Z",
     "start_time": "2018-12-25T19:32:52.922631Z"
    }
   },
   "outputs": [],
   "source": [
    "results['hdf_table'] = {'read': read.all_runs, 'write': write.all_runs, 'size': size}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Table Select"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:55.714668Z",
     "start_time": "2018-12-25T19:32:52.932594Z"
    }
   },
   "outputs": [],
   "source": [
    "with pd.HDFStore(test_store) as store:\n",
    "    store.append('file', df, format='t', data_columns=['company', 'form'])\n",
    "size = test_store.stat().st_size "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Read"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:55.717273Z",
     "start_time": "2018-12-25T19:32:55.715537Z"
    }
   },
   "outputs": [],
   "source": [
    "company = 'APPLE INC'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:55.732020Z",
     "start_time": "2018-12-25T19:32:55.718471Z"
    }
   },
   "outputs": [],
   "source": [
    "# %%timeit\n",
    "# with pd.HDFStore(test_store) as store:\n",
    "#     s = store.select('file', 'company = company')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:55.739634Z",
     "start_time": "2018-12-25T19:32:55.732893Z"
    }
   },
   "outputs": [],
   "source": [
    "# read = _"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:55.754609Z",
     "start_time": "2018-12-25T19:32:55.740609Z"
    }
   },
   "outputs": [],
   "source": [
    "# test_store.unlink()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Write"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:55.770611Z",
     "start_time": "2018-12-25T19:32:55.760229Z"
    }
   },
   "outputs": [],
   "source": [
    "# %%timeit\n",
    "# with pd.HDFStore(test_store) as store:\n",
    "#     store.append('file', df, format='t', data_columns=['company', 'form'])\n",
    "# test_store.unlink() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:55.780717Z",
     "start_time": "2018-12-25T19:32:55.775462Z"
    }
   },
   "outputs": [],
   "source": [
    "# write = _"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:55.791169Z",
     "start_time": "2018-12-25T19:32:55.784143Z"
    }
   },
   "outputs": [],
   "source": [
    "# results['hdf_select'] = {'read': read.all_runs, 'write': write.all_runs, 'size': size}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## CSV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:32:55.799134Z",
     "start_time": "2018-12-25T19:32:55.793931Z"
    }
   },
   "outputs": [],
   "source": [
    "test_csv = Path('test.csv')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:35:58.303380Z",
     "start_time": "2018-12-25T19:32:55.800490Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3854558165"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.to_csv(test_csv)\n",
    "test_csv.stat().st_size"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Read"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:40:11.610187Z",
     "start_time": "2018-12-25T19:35:58.304356Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "31.5 s ± 163 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<TimeitResult : 31.5 s ± 163 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)>"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%timeit -o\n",
    "df = pd.read_csv(test_csv)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:40:11.612572Z",
     "start_time": "2018-12-25T19:40:11.611076Z"
    }
   },
   "outputs": [],
   "source": [
    "read = _"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T19:40:11.883110Z",
     "start_time": "2018-12-25T19:40:11.613329Z"
    }
   },
   "outputs": [],
   "source": [
    "test_csv.unlink()  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Write"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T20:05:17.094885Z",
     "start_time": "2018-12-25T19:40:11.884098Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3min 7s ± 1.95 s per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<TimeitResult : 3min 7s ± 1.95 s per loop (mean ± std. dev. of 7 runs, 1 loop each)>"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%timeit -o\n",
    "df.to_csv(test_csv)\n",
    "test_csv.unlink()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T20:05:17.097605Z",
     "start_time": "2018-12-25T20:05:17.095959Z"
    }
   },
   "outputs": [],
   "source": [
    "write = _"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T20:05:17.113054Z",
     "start_time": "2018-12-25T20:05:17.099971Z"
    }
   },
   "outputs": [],
   "source": [
    "results['csv'] = {'read': read.all_runs, 'write': write.all_runs, 'size': size}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Store Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T20:06:46.934191Z",
     "start_time": "2018-12-25T20:06:46.804080Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "text_num = pd.concat([pd.DataFrame(data).mean().to_frame(f) for f, data in results.items()], axis=1).T\n",
    "text_num[['read', 'write']].plot.barh();"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T20:06:55.202262Z",
     "start_time": "2018-12-25T20:06:55.084326Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df = pd.concat([pd.DataFrame(data).mean().to_frame(f) for f, data in results.items()], axis=1).T\n",
    "# df.to_csv('num_only.csv')\n",
    "df[['read', 'write']].plot.barh();"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-12-25T20:05:17.162332Z",
     "start_time": "2018-12-25T19:29:45.832Z"
    }
   },
   "outputs": [],
   "source": [
    "# for f, data in results.items():\n",
    "#     pd.DataFrame(data).to_csv('{}.csv'.format(f))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
